package com.linkgie.galaxyframework.crypto.spi;

import java.util.Collection;

import com.linkgie.galaxyframework.crypto.Algorithm;
import com.linkgie.galaxyframework.crypto.CryptogramType;

/**
 * 密码操作服务提供接口；
 * 
 * @author liso
 *
 */
public interface CryptoFuncSPI {

	/**
	 * 密码算法；
	 * 
	 * @return
	 */
	Algorithm getAlgorithm();

	/**
	 * 密码数据编解码器列表；
	 * <p>
	 * 
	 * 实现者为支持的每一种密码数据类型 ( {@link CryptogramType} ）都需要定义对应的密码数据编码解码器 (
	 * {@link BytesCodec} ）；
	 * 
	 * <p>
	 * 如果实现者没有支持的密码数据类型，则返回长度为 0 的空列表；
	 * 
	 * @return
	 */
	Collection<CryptobytesCodec<?>> getCryptogramCodecs();

	/**
	 * 支持的密码数据类型；
	 * 
	 * @return
	 */
	default CryptogramType[] getCryptogramTypes() {
		Collection<CryptobytesCodec<?>> codecs = getCryptogramCodecs();
		return codecs.stream().map(a -> a.getCryptogramType()).toArray(CryptogramType[]::new);
	}
}
